/*
 * WarteschlangeErzeugung.java
 * 
 *  author: Daniel Rudigier
 *    date: 05.06.2008
 * 
 * 
 */
package ocumed.applikation.domainhandling;

import java.util.List;
import java.util.TreeSet;
import java.util.Vector;

import ocumed.domaene.behandlung.DWarteposition;
import ocumed.domaene.behandlung.DWarteschlange;
import ocumed.domaene.benutzerverwaltung.arztverwaltung.DArzt;
import ocumed.persistenz.dao.BenutzerDAO;
import ocumed.persistenz.dao.DAOFactory;
import ocumed.persistenz.dao.WartepositionDAO;
import ocumed.persistenz.hibernate.OcWarteposition;
import ocumed.teams.IPatient;
import ocumed.teams.ITermin;
import ocumed.teams.IWarteposition;
import ocumed.teams.IWarteschlange;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author Daniel Rudigier
 *
 */
public class WarteschlangeErzeugung {
    private static final Log log = LogFactory.getLog(WarteschlangeErzeugung.class);
    
    // access the domain handler
    private DomainHandler dh;

    // DAO interfaces
    protected WartepositionDAO m_wartepositionDAO;
    
    /**
     * constructor
     * 
     */
    public WarteschlangeErzeugung() {
        dh = DomainHandler.getInstance();
        m_wartepositionDAO = DAOFactory.get(DAOFactory.RDBMS).getWartepositionDAO();
    }
    
    /**
     * @param a
     * @return
     */
    public IWarteschlange getDWarteschlange(DArzt a) {
        log.debug("loading queue from db for doctor: #" + a.getBenutzerid());
        m_wartepositionDAO.start();

        TreeSet<IWarteposition> set = new TreeSet<IWarteposition>();
        // TODO: delegate to persistence: findByDoctor
        for (OcWarteposition wp : m_wartepositionDAO.findAll()) {
            if (wp.getOcBenutzer().getBenutzerid() == a.getBenutzerid()) {
                IWarteposition w = getWp(wp, a);
                set.add(w);
            }
        }
        
        // somehow, it's needed... (wasted time for that missing line: 4h)
        m_wartepositionDAO.commit();
        
        DWarteschlange w = new DWarteschlange(a, set);
        return w;
    }

    /**
     * return a fresh queue for a specific doctor
     * 
     * @param arztId 
     * @return 
     */
    public IWarteschlange getDWarteschlange(int arztId) {
        DArzt a = DomainHandler.be.getDArzt(arztId);
        return getDWarteschlange(a);
    }

    /**
     * get a queue position
     * 
     * @param wp
     * @param a
     * @return
     */
    private IWarteposition getWp(OcWarteposition wp, DArzt a) {
        ITermin t = null;
        if (wp.getOcTermin() != null) {
            t = DomainHandler.te.getDTermin(wp.getOcTermin(), a);
        }
        IPatient p = DomainHandler.pe.getDPatient(wp.getOcPatient(), a);
        return new DWarteposition(wp.getWartepositionid(), a, t, p, wp
                .getWartepositionnr());
    }

}
